
#include "sys.h"
#include "STM32F10x_EXTI.h"
#include "MPU6050.h"
#include "SysTick.h"
#include "usart.h"
#include "I2CMPU6050.h"
#include "exti.h"
#include "stdlib.h"
#include "delay.h"
#include "tim.h"
#include "pid.h"
#include "kalman.h"
#include "balance.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK战舰STM32开发板

/**************************************************************************
函数功能：外部中断初始化
入口参数：无
返回  值：无 
作    用：是用来配置MPU6050引脚INT的，每当MPU6050有数据输出时，引脚INT有相应的电平输出。
					依次来触发外部中断作为控制周期。保持MPU6050数据的实时性。
**************************************************************************/
extern balance_t balance;
 extern int16_t Encoder_Left,Encoder_Right;
float Pitch,Roll,Yaw;
extern short gyro[3];	
extern Kalman kfp;
void EXTIX_Init(void)
{
 
   	GPIO_InitTypeDef GPIO_InitStructure;
		EXTI_InitTypeDef EXTI_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断，需要使能AFIO时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	            //端口配置
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
		GPIO_Init(GPIOB, &GPIO_InitStructure);		//根据设定参数初始化GPIOB 
	
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);

  	EXTI_InitStructure.EXTI_Line=EXTI_Line5;
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

		//////////////////外部中断5优先级配置也就是MPU6050 INT引脚的配置///////////因为是控制中断，故此优先级应是最高。
		NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;				//使能外部中断通道
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;	//抢占优先级0， 
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级1
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
		NVIC_Init(&NVIC_InitStructure); 
				
}


void EXTI9_5_IRQHandler(void)  //表示10ms中断时间到
{    
	
	if(EXTI_GetITStatus(EXTI_Line5)!=0)//一级判定,看陀螺仪有没有中断
		{
			
		if(PBin(5)==0)//二级判定   看看有没有数据  低电平
			{
				
//				//1.采集编码器数据&MPU6050角度信息。
				Encoder_Left=-Read_Encoder(3);//电机是相对安装，刚好相差180度，为了编码器输出极性一致，就需要对其中一个取反。
				Encoder_Right=Read_Encoder(4);			
				MPU6050_Pose(&Pitch,&Roll,&Yaw);			//角度
				balance.gro_spd = KalmanFilter(&kfp,gyro[1]);
				balance_calc();
			}
			EXTI_ClearITPendingBit(EXTI_Line5);//清除中断标志位
		}
		
}
		


